/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.credsoft.copcred.model.vo;

import br.gov.caixa.gisutsa.framework.tapiocaframework.persistencia.AbstractEntity;
import java.util.Calendar;
import java.util.LinkedList;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Version;

/**
 *
 * @author Sales
 * @since 2009-05-29
 */
@Entity
@Table(name = "empresa")
public class Empresa extends AbstractEntity {

    private static final long serialVersionUID = -204134859000046889L;
    private Long id;
    private int versao;
    private String nomeFantasia;
    private String razaoSocial;
    private String cnpj;
    private String responsavel;
    private String email;
    private String telefone;
    private Calendar acessoExpirado;
    private List<Usuario> usuarios;
    private List<Portifolio> portifolios;
    private List<ContratoEntidadeFinanceira> contratosEntidadeFinanceira;
    private List<ContratoCorretor> contratosCorretor;
    private List<Cliente> clientes;

    public Empresa() {
        Calendar c = Calendar.getInstance();
        c.roll(Calendar.MONTH, true);
        this.acessoExpirado = c;
        this.usuarios = new LinkedList<Usuario>();
        this.portifolios = new LinkedList<Portifolio>();
        this.contratosEntidadeFinanceira = new LinkedList<ContratoEntidadeFinanceira>();
        this.contratosCorretor = new LinkedList<ContratoCorretor>();

    }

    public Empresa(Long id) {
        this();
        this.id = id;
    }

    public Empresa(Long id, String nomeFantasia, String razaoSocial, String cnpj, String responsavel, String email, String telefone) {
        this(id);
        this.nomeFantasia = nomeFantasia;
        this.razaoSocial = razaoSocial;
        this.cnpj = cnpj;
        this.responsavel = responsavel;
        this.email = email;
        this.telefone = telefone;
    }

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "empresa_id", nullable = false)
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @Version
    @Column(name = "versao", nullable = false)
    public int getVersao() {
        return versao;
    }

    public void setVersao(int versao) {
        this.versao = versao;
    }

    @Column(name = "nome_fantasia", nullable = false, length = 40)
    public String getNomeFantasia() {
        return nomeFantasia;
    }

    public void setNomeFantasia(String nomeFantasia) {
        this.nomeFantasia = nomeFantasia;
    }

    @Column(name = "razao_social", nullable = false, length = 80)
    public String getRazaoSocial() {
        return razaoSocial;
    }

    public void setRazaoSocial(String razaoSocial) {
        this.razaoSocial = razaoSocial;
    }

    @Column(name = "cnpj", nullable = false, length = 14)
    public String getCnpj() {
        return cnpj;
    }

    public void setCnpj(String cnpj) {
        this.cnpj = cnpj;
    }

    @Column(name = "responsavel", nullable = false, length = 50)
    public String getResponsavel() {
        return responsavel;
    }

    public void setResponsavel(String responsavel) {
        this.responsavel = responsavel;
    }

    @Column(name = "email", nullable = false, length = 50)
    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Column(name = "telefone", nullable = false, length = 10)
    public String getTelefone() {
        return telefone;
    }

    public void setTelefone(String telefone) {
        this.telefone = telefone;
    }

    @Temporal(TemporalType.DATE)
    @Column(name = "acesso_expirado", nullable = true)
    public Calendar getAcessoExpirado() {
        return acessoExpirado;
    }

    public void setAcessoExpirado(Calendar acessoExpirado) {
        this.acessoExpirado = acessoExpirado;
    }

    @OneToMany(targetEntity = Usuario.class, mappedBy = "empresa")
    public List<Usuario> getUsuarios() {
        return usuarios;
    }

    public void setUsuarios(List<Usuario> usuarios) {
        this.usuarios = usuarios;
    }

    @OneToMany(targetEntity = Portifolio.class, mappedBy = "empresa")
    public List<Portifolio> getPortifolios() {
        return portifolios;
    }

    public void setPortifolios(List<Portifolio> portifolios) {
        this.portifolios = portifolios;
    }

    @OneToMany(targetEntity = ContratoEntidadeFinanceira.class, mappedBy = "empresa")
    public List<ContratoEntidadeFinanceira> getContratosEntidadeFinanceira() {
        return contratosEntidadeFinanceira;
    }

    public void setContratosEntidadeFinanceira(List<ContratoEntidadeFinanceira> contratosEntidadeFinanceira) {
        this.contratosEntidadeFinanceira = contratosEntidadeFinanceira;
    }

    @OneToMany(targetEntity = ContratoCorretor.class, mappedBy = "empresa")
    public List<ContratoCorretor> getContratosCorretor() {
        return contratosCorretor;
    }

    public void setContratosCorretor(List<ContratoCorretor> contratosCorretor) {
        this.contratosCorretor = contratosCorretor;
    }

    @OneToMany(targetEntity = Cliente.class, mappedBy = "empresa")
    public List<Cliente> getClientes() {
        return clientes;
    }

    public void setClientes(List<Cliente> clientes) {
        this.clientes = clientes;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Empresa other = (Empresa) obj;
        if (this.id != other.id && (this.id == null || !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        int hash = 5;
        hash = 31 * hash + (this.id != null ? this.id.hashCode() : 0);
        return hash;
    }

    public void addUsuario(Usuario usuario) {
        usuario.setEmpresa(this);
        this.usuarios.add(usuario);
    }

    public void removeUsuario(Usuario usuario) {
        this.usuarios.remove(usuario);
    }

    public void addPortifolio(Portifolio portifolio) {
        portifolio.setEmpresa(this);
        this.portifolios.add(portifolio);
    }

    public void removePortifolio(Portifolio portifolio) {
        this.portifolios.remove(portifolio);
    }

    public void addContratoEntidadeFinanceira(ContratoEntidadeFinanceira contrato) {
        contrato.setEmpresa(this);
        this.contratosEntidadeFinanceira.add(contrato);
    }

    public void removeContratoEntidadeFinanceira(ContratoEntidadeFinanceira contrato) {
        this.contratosEntidadeFinanceira.remove(contrato);
    }

    public void addContratoCorretor(ContratoCorretor contrato) {
        contrato.setEmpresa(this);
        this.contratosCorretor.add(contrato);
    }

    public void removeContratoCorretor(ContratoCorretor contrato) {
        this.contratosCorretor.remove(contrato);
    }
}
